package com.platform.comm.util;

/**
 * Description: 使用尾递归的类，目的是对外统一
 *
 * @author libin
 * Created on 2019/5/17
 **/
public class TailCalls {

    /**
     * 获得当前递归的下一个递归
     * @param nextCall 下一个递归
     * @param <T> 类型
     * @return 下一个递归
     */
    public static <T> TailCall<T> call(final TailCall<T> nextCall) {
        return nextCall;
    }

    /**
     * 结束当前递归，重写对应的默认方法，完成状态改为true，设置最终返回结果，设置非递归调用
     * @param value 最终递归值
     * @param <T>
     * @return 一个isComplete状态为true的尾递归，外部通过接口的invoke方法及早求值，启动递归求值
     */
    public static <T> TailCall<T> done(final T value) {
        return new TailCall<T>() {
            @Override public boolean isComplete() { return true; }
            @Override public T result() { return value; }
            @Override public TailCall<T> apply() {
                throw new Error("end of recursion");
            }
        };
    }
}
